package com.xuxu.simple;


import com.rabbitmq.client.*;
import com.xuxu.util.RabbitConnectionUtil;

import java.io.IOException;

/**
 * 简单的RabbitMQ 消费端
 *
 * 操作步骤：
 *
 */
public class Consumer {

    //定义静态变量队列名称 QUEUE_NAME => 简单的队列
    //注意⚠️：在消费端的这个队列名称必须要和 生产者的 队列名称 保持一致，一点都不可以有差别
    static final String QUEUE_NAME = "simple_queue";

    public static void main(String[] args) throws Exception {
        //调用Rabbit工具类中的方法，获取连接对象
        Connection connection = RabbitConnectionUtil.getConnection();

        //根据连接对象，创建队列
        Channel channel = connection.createChannel();

        //声明队列
        /*
            参数一：队列名称，要和 生产者的 的队列名称保持一致
            参数二：是否持久化队列
            参数三：是否独占本次连接
            参数四：是否在不使用的时候删除队列
            参数五：队列的其他参数 是一个map集合
         */
        channel.queueDeclare(QUEUE_NAME,true,false,false,null);

        //创建消费者对象，并且设置消息处理
        DefaultConsumer consumer = new DefaultConsumer(channel){

            /**
             * 重写handleDelivery方法，设置消息的处理方式
             * @param consumerTag   消费者标签
             * @param envelope  消息包的内容，包含 消息的id、消息的routingKey(路由key)、交换机、消息 和重传标志(收到消息失败后是否重新发送)
             * @param properties  属性信息
             * @param body  消息
             * @throws IOException
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                //获取路由key
                String routingKey = envelope.getRoutingKey();
                System.out.println("路由key -------------"+routingKey);

                //获取交换机
                String exchange = envelope.getExchange();
                System.out.println("交换机 -------------"+exchange);

                //获取消息id
                long deliveryTag = envelope.getDeliveryTag();
                System.out.println("消息id -------------"+deliveryTag);

                //获取消息内容
                System.out.println("消息内容是----------"+new String(body,"utf-8"));
            }
        };

        /*
            监听消息：
            参数1：队列名称
            参数2：设置是否进行自动确认，设置true之后表示收到消息后自动向RabbitMQ回复消息"收到了"，
                  RabbitMQ收到回复之后会删除这个消息；设置成false需要手动确认。
            参数3：消费者对象 consumer

         */
        channel.basicConsume(QUEUE_NAME,true,consumer);

    }

}
